package ar.com.ctrln.view.dashboard.ventas.servicio;

import java.text.DecimalFormat;
import java.util.HashSet;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Doublebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.ventas.servicio.ConsultarContratacionServicio;
import ar.com.ctrln.control.ventas.servicio.RegistrarContratacionServicio;
import ar.com.ctrln.persistence.model.contratacion.ContratacionServicio;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacion;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacionInternet;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacionTelefonia;
import ar.com.ctrln.persistence.model.servicios.telefonia.Operador;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class EditarContratacionServicioController extends
		AbstractMinimizarVentana {

	private static final long serialVersionUID = -4825064109993868352L;

	@WireVariable
	private RegistrarContratacionServicio registrarContratacion;

	@WireVariable
	private ConsultarContratacionServicio consultarContratacion;

	@SuppressWarnings("rawtypes")
	private EventQueue seleccionOperador;

	@Wire
	private Window wEditarContratacionServicio;

	@Wire
	private Label lClienteSelect;

	@Wire
	private Label lTipoActividad;

	@Wire
	private Label lLocalidad;

	@Wire
	private Label lProvincia;

	@Wire
	private Label lTipoCliente;

	@Wire
	private Row rowTelefonia;

	@Wire
	private Row rowInternet;

	@Wire
	private Combobox cboTipoServicio;

	@Wire
	private Combobox cboServicio;

	@Wire
	private Doublebox tbABandaSubida;

	@Wire
	private Doublebox tbABandaBajada;

	@Wire
	private Intbox tbAbonados;

	@Wire
	private Intbox tbtbBloquesIp;

	@Wire
	private Intbox tbNroDeTramas;

	@Wire
	private Intbox tbClaveOrigen;

	@Wire
	private Textbox tbObservacion;

	@Wire
	private Combobox cbopProtocolo;

	@Wire
	private Listbox lbOperadores;

	@Wire
	private Listbox lbDetalle;

	private Set<Operador> operadores;

	private ListModelList<DetalleContratacion> modelo;

	private ContratacionServicio contratacionServicio;

	private ListModelList<Operador> modeloOperador;

	DecimalFormat dtime = new DecimalFormat("####.##");

	@SuppressWarnings({ "unchecked" })
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		lbDetalle.addEventListener("onSelect", new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {
				onDetalleSelected();

			}
		});

		lbDetalle.addEventListener("onAfterRender", new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {
				if (lbOperadores.getSelectedItem() != null) {
					DetalleContratacionTelefonia telefonia = lbDetalle
							.getSelectedItem().getValue();
					Set<Operador> operadores = new HashSet<Operador>();
					for (Operador o : modeloOperador.getInnerList()) {
						operadores.add(o);
					}
					telefonia.setOperadores(operadores);

				}
			}
		});

		contratacionServicio = (ContratacionServicio) this.getSelf()
				.getParent().getAttribute("contratacion");

		contratacionServicio.setDetalles(consultarContratacion
				.listarDetallesContrato(contratacionServicio.getId()));

		modelo = new ListModelList<DetalleContratacion>();

		modelo.addAll(contratacionServicio.getDetalles());

		lbDetalle.setModel(modelo);

		operadores = new HashSet<Operador>();

		rowInternet.setVisible(false);
		rowTelefonia.setVisible(false);

		seleccionOperador = EventQueues.lookup("seleccionar_operador",
				EventQueues.DESKTOP, true);
		seleccionOperador.subscribe(new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {
				Operador operador = (Operador) event.getData();
				operadores.add(operador);
				lbOperadores.setModel(new ListModelList<Operador>(operadores));
			}
		});
	}

	@Listen("onClick = #iAgregarOperador")
	public void selectOperador() {
		Executions.createComponents(
				"/zul/ventas/contratacion/agregarOperador.zul", null, null);
	}

	@Listen("onClick = #iEliminarDetalle")
	public void deleteOperador() {
		Operador operador = lbOperadores.getSelectedItem().getValue();
		operadores.remove(operador);
		lbOperadores.setModel(new ListModelList<Operador>(operadores));

	}

	@Listen("onSelect = #lbDetalle")
	private void onDetalleSelected() {
		DetalleContratacion detalle = lbDetalle.getSelectedItem().getValue();

		if (detalle instanceof DetalleContratacionInternet) {

			rowInternet.setVisible(true);
			rowTelefonia.setVisible(false);

			DetalleContratacionInternet internet = (DetalleContratacionInternet) detalle;

			tbABandaSubida.setText(internet.getAnchoBandaSubida() + "");
			tbABandaSubida.setAttribute("b", internet);

			tbABandaBajada.setText(internet.getAnchoBandaBajada() + "");
			tbABandaBajada.setAttribute("b", internet);

			tbAbonados.setText((internet.getCantidadUsuarios() + ""));
			tbAbonados.setAttribute("b", internet);

			tbtbBloquesIp.setText(internet.getCantidadBloquesIp() + "");
			tbtbBloquesIp.setAttribute("b", internet);
			String protocolo = internet.getProtocoloRouting();

			cbopProtocolo.setAttribute("b", internet);

			if (protocolo.equals("RIP v1")) {
				cbopProtocolo.setSelectedIndex(1);
			} else if (protocolo.equals("RIP v2")) {
				cbopProtocolo.setSelectedIndex(2);
			} else if (protocolo.equals("IGRP")) {
				cbopProtocolo.setSelectedIndex(3);
			} else if (protocolo.equals("EGRP")) {

			}
		} else if (detalle instanceof DetalleContratacionTelefonia) {

			rowTelefonia.setVisible(true);
			rowInternet.setVisible(false);

			DetalleContratacionTelefonia telefonia = (DetalleContratacionTelefonia) detalle;

			tbClaveOrigen.setText(telefonia.getClave() + "");
			tbClaveOrigen.setAttribute("b", telefonia);

			tbNroDeTramas.setText(telefonia.getNroTramas() + "");
			tbNroDeTramas.setAttribute("b", telefonia);
			modeloOperador = new ListModelList<Operador>();

			modeloOperador.addAll(telefonia.getOperadores());

			lbOperadores.setModel(modeloOperador);

		}

	}

	@Listen("onChange = #tbAbonados")
	public void onCantidadUsuariosChange() {
		DetalleContratacionInternet internet = (DetalleContratacionInternet) tbAbonados
				.getAttribute("b");
		internet.setCantidadUsuarios(tbAbonados.getValue());
		if ("Solo Mail".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.02)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.05)));

		} else if ("Dial-Up 15 hs".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.02)));
			tbABandaBajada.setValue((tbAbonados.getValue() * 0.05));

		} else if ("Dial-Up Full".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.02)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.05)));

		} else if ("768 Kb".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.035)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.075)));

		} else if ("1 Mb".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.065)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.128)));

		} else if ("1.5 Mb".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.085)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.175)));

		} else if ("2.5 Mb".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.195)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.325)));

		} else if ("4.5 Mb".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.256)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.512)));

		} else if ("IPremium".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.128)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.256)));

		} else if ("IPremium-Basica".equals(internet.getServicio().getNombre())) {
			tbABandaSubida.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.128)));
			tbABandaBajada.setValue(Double.parseDouble(dtime.format(tbAbonados
					.getValue() * 0.256)));

		}
		internet.setAnchoBandaBajada(tbABandaBajada.getValue());
		internet.setAnchoBandaSubida(tbABandaSubida.getValue());
	}

	@Listen("onClick = #actualizarServicio")
	public void actualizarServicioInternet() {

		for (DetalleContratacion detalle : modelo.getInnerList()) {
			consultarContratacion.actualizarDetalle(detalle);
		}

		wEditarContratacionServicio.onClose();
	}

	@Listen("onClick = #cancelar")
	public void volverConsultar() {

		seleccionOperador.close();
		wEditarContratacionServicio.onClose();
	}

}
